Recent advances in computer performance have enabled graphic systems to provide more realistic graphical images using personal computers and home video game computers. In such graphic systems, some procedure must be implemented to “render” or draw graphic primitives to the screen of the system. A “graphic primitive” is a basic component of a graphic picture, such as a polygon, e.g., a triangle, or a vector. All graphic pictures are formed with combinations of these graphic primitives. Many procedures may be utilized to perform graphic primitive rendering.
Texture mapping schemes were developed to enhance the images rendered by early graphics systems. Early graphic systems displayed images representing objects having extremely smooth surfaces. That is, textures, bumps, scratches, or other surface features were not modeled. In order to improve the quality of the image, texture mapping was developed to model the complexity of real world surface images. In general, texture mapping is the mapping of an image or a function onto a surface in three dimensions. For example, the texture would be a picture of whatever material the designer was trying to convey (e.g., brick, stone, vegetation, wood, etc.) and would contain shading information as well as the texture and color to create the impression of a complex, dimensional surface. Texture mapping is now widely established and widely implemented in most computer graphics systems.
Modern realistic texture mapping (e.g., as required for modern 3D rendering applications) requires the manipulation of large amounts of data. Generally speaking, as a given 3-D scene becomes more realistic, the more realistic the texture map (or simply texture) being used in the texture mapping operations. Accordingly, realistic high-resolution textures can be very large (e.g., several megabytes of data). The bandwidth required for accessing such textures is also very large. The memory and bandwidth requirements can exceed the capabilities of even the most modern real-time 3-D rendering systems.
One prior art approach to alleviating texture memory and bandwidth requirements involves the implementation of various schemes whereby only a sub portion of the texture that may be needed in a scene is fetched from memory at a time. Large textures are typically stored in system memory, as opposed to local graphics memory. To satisfy the bandwidth requirements and latency constraints, a sub portion of the texture is fetched into the local graphics memory and used in the texture mapping operations of the 3-D rendering process.
For example, one prior art scheme only fetches that portion of a texture that is needed to render the visible scene (e.g., that portion of the scene within the view volume). As the scene changes (e.g., as the viewpoint of the view volume changes), other portions of the texture are fetched as required. This technique relies on a page fault type mechanism to fetch needed texture data when that data is not resident in local graphics memory.
The problems with this approach is the amount of time required to fetch the needed texture data from system memory to the local graphics memory. The required texture data needs to be pulled in (e.g., DMA transfer) from the system memory via the system memory controller and graphics bus (e.g., AGP bus, PCI express, etc.). The data transfer bandwidth from system memory via the graphics bus is much lower than that from the local graphics memory. Additionally, there is a significant amount of added latency imposed on data transfers across the graphics bus.
The above problems increase the time required to service the texture data page fault. This delay can cause stalling of the graphics rendering pipeline. Such stalling is very harmful to real-time 3D rendering applications. The stalling often leads to choppy frame rates and other noticeable pauses when new texture data must be fetched.
Some 3D rendering applications are especially dependent on smooth and reliable access to needed texture data. For example, MIP mapping generally requires several versions of a given texture to be stored and available in local graphics memory (e.g., a full resolution version and several lower resolution versions of a texture), and hence, texture memory demands tend to be high. In a highly dynamic rendering environment where the rendered scene changes rapidly, high bandwidth low latency access to the texture data is critical to overall performance. Stalling the 3D rendering pipeline due to prior art page fault type texture fetching rapidly leads to choppy frame rates, noticeable pauses, and similar problems as the rendered scene changes.
One approach to maintaining rendering speed and frame rate is to increase the amount of local graphics memory (e.g., 128 Mb, 256 Mb, etc.). Such an approach is expensive. Another prior art solution is to increase the performance of the page fault handling system. This approach is also expensive, in that it can require expensive high speed components (e.g., multi channel system memory, exotic high speed DDR RAM, PCIx graphics bus, etc.). Even with such components, however, there are practical limits to the degree to which the performance of the prior art page fault texture memory fetching schemes can be improved. Thus, what is needed is a more efficient way to maintain rendering speed and frame rate for those 3D rendering applications that utilize texture mapping.